//package yuyi;
//
//import cifa.CIFFAAnalysis;
//import cifa.LexicalAnalysis;
//import cifa.Pair;
//import cifa.Tuple;
//
//import java.io.BufferedReader;
//import java.io.FileInputStream;
//import java.io.IOException;
//import java.io.InputStreamReader;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @创建人 MBY381
// * @创建时间 2022/6/25 14:41
// * @描述 暂无
// */
//public class SemanticAnalysis {
//    private String path;
//    private int tempAddress = 500;
//    private Pair pair;
//    private CIFFAAnalysis analyser;
//    private List<SymItem> symTable;  //符号表
//    private List<ConItem> conTable; //常数表
//    private List<Item> table; //四元式表
//
//
//    public List<SymItem> getSymTable() {
//        return symTable;
//    }
//
//    public List<ConItem> getConTable() {
//        return conTable;
//    }
//
//    public List<Item> getTable() {
//        return table;
//    }
//
//    public SemanticAnalysis(){
//        super();
//    }
//
//    public SemanticAnalysis(String path){
//        super();
//        this.path = path;
//        symTable = new ArrayList<SymItem>();
//        conTable = new ArrayList<ConItem>();
//        table = new ArrayList<Item>();
//
//    }
//
//    //获取下一个二元组
//    private void advance(){
//        try {
//            pair = analyser.process();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    //生成四元式
//    private void addItem(String op, int addr1,int addr2,int addr3){
//        Item item = new Item(op,addr1,addr2,addr3);
//        table.add(item);
//    }
//
//    //检查符号表，找到则返回符号信息，找不到则返回空
//    private SymItem checkSym(String value){
//        SymItem item = null;
//        for(int i = 0;i<symTable.size();i++){
//            if(symTable.get(i).getName().equalsIgnoreCase(value))
//                item = symTable.get(i);
//        }
//        return item;
//    }
//    //插入符号表 返回值为地址
//    private int addSym(Tuple tuple){
//        SymItem item = null;
//        if(tuple.getFirst()==14){
//            item = new SymItem(tuple.getValue(),"int");
//        }else if(tuple.getFirst()==15){
//            item = new SymItem(tuple.getValue(),"const");
//        }
//        symTable.add(item);
//        return item.getAddress();
//    }
//
//    //插入常数表，如果存在则不插入，返回值为地址
//    private int addCon(String con){
//        for(int i=0;i< conTable.size();i++){
//            if(conTable.get(i).getName().equals(con)){
//                return conTable.get(i).getAddress();
//            }
//        }
//        ConItem item = new ConItem(con,"int");
//        conTable.add(item);
//        return item.getAddress();
//    }
//
//
//    public void sen() throws SemanticException{
//        //定义语句
//        if(pair.getFirst()==4){
//            defineSen();
//        }
//        //赋值语句
//        else if(pair.getFirst()==14){
//            assignSen();
//        }
//        //循环语句
//        else if(pair.getFirst()==12){
//            whileSen();
//        }
//        //复合语句
//        else if(pair.getFirst()==2){
//            complexSen();
//        }
//        //分支语句
//        else if(pair.getFirst()==9){
//            branchSen();
//        }
//        //空语句
//        else{
//            advance();
//        }
//    }
//
//    //进入定义语句
//    private void defineSen() throws SemanticException{
//        advance();
//        advance();
//        while(pair.getFirst()==14){
//            if(checkSym(pair.getValue())==null){
//                addSym(pair);
//                advance();
//                if(pair.getFirst()==20){ //如果是逗号
//                    advance();
//                }
//            }else throw new SemanticException(analyser.getLineNum(), analyser.getColNum()-1,"变量重复定义");
//        }
//        advance(); //读入下一条语句的第一个元组
//    }
//
//    //进入赋值语句
//    private void assignSen() throws SemanticException {
//        SymItem item = checkSym(pair.getValue());
//        if(item!=null){
//            advance();
//            advance();//跳过赋值号
//            int address = computeSenE(); //进入表达式
//            addItem(":=",address,0,item.getAddress());
//            advance();
//        }else throw new SemanticException(analyser.getLineNum(), analyser.getColNum()-1,"变量未定义");
//    }
//
//    private int computeSenE() throws SemanticException{
//        int address= computeSenT();
//        int temp;
//        while((pair.getFirst() == 16)||(pair.getFirst() == 31)){  //加减号
//            String op = pair.getValue();
//            advance();
//            temp = computeSenT();
//            addItem(op,address,temp,tempAddress);
//            address = tempAddress;
//            tempAddress+=4;
//        }
//        return address;
//    }
//
//    private int computeSenT() throws SemanticException{
//        int temp;
//        int address = computeSenF();
//        while((pair.getFirst() == 17)||(pair.getFirst() == 30)){ //乘除号
//            String op = pair.getValue();
//            advance();
//            temp = computeSenF();
//            addItem(op,address,temp,tempAddress);
//            address = tempAddress;
//            tempAddress+=4;
//        }
//        return address;
//    }
//    private int computeSenF() throws SemanticException{
//        int address = 0 ;
//        if((pair.getFirst() == 14)||(pair.getFirst() == 15)){//数字或者变量
//            if(pair.getFirst() == 14){  //标识符
//                SymItem item =  checkSym(pair.getValue());
//                if(item!=null)
//                {
//                    address =  item.getAddress();
//                }
//                else throw new SemanticException(analyser.getLineNum(), analyser.getColNum()-1,"变量未定义");
//            }
//            else{  //常数
//                address = addCon(pair.getValue());
//            }
//            advance();
//            return address;
//        }
//        else if(pair.getFirst() == 18){//左括号
//            advance();
//            address = computeSenE();
//            if(pair.getFirst() == 19){//右括号
//                advance();
//                return address;
//            }
//        }
//        return address;
//    }
//
//
//
//    //进入复合语句
//    private void complexSen() throws SemanticException{
//        advance();
//        while(pair.getFirst()!=3)
//            sen();
//        advance();
//    }
//
//    private void branchSen() throws SemanticException{
//        List<Integer> truelist = new ArrayList<Integer>();
//        List<Integer> falselist = new ArrayList<Integer>();
//        advance();
//        boolSen(truelist,falselist);
//        if(pair.getFirst() == 10){//then
//            fillBack(truelist,table.size());  //条件为真时要执行的语句开始
//            advance();
//            sen();
//
//            if(pair.getFirst() == 11){//如果有else
//                addItem("j",0,0,0);  //then后面的语句要跳过else里的语句
//                truelist.add(table.size()-1);
//                fillBack(falselist,table.size()); //回填else语句的位置
//
//                //else语句内容
//                advance();
//                sen();
//            }else{ //如果没有else
//                fillBack(falselist,table.size());
//            }
//            fillBack(truelist,table.size());  //回填下一条语句的标号给分支语句里
//        }
//    }
//
//    private void boolSen(List<Integer> truelist,List<Integer> falselist) throws SemanticException{ //布尔表达式  or连接的
//        boolSenA(truelist,falselist);
//        truelist.add(table.size()-1);
//        while(pair.getFirst() == 7){
//            fillBack(falselist,table.size());  //当and项为假时跳至or项
//            advance();
//            boolSenA(truelist,falselist);
//            truelist.add(table.size()-1);
//        }
//        addItem("j",0,0,0);  //条件全为假时的跳转,包括最后一个and项的跳转
//        falselist.add(table.size()-1);
//    }
//    private void boolSenA(List<Integer> truelist,List<Integer> falselist) throws SemanticException{//AND 连接的项
//        List<Integer> nextlist = new ArrayList<Integer>();
//        boolSenb(truelist,falselist);
//        while(pair.getFirst() == 6){
//            nextlist.add(table.size()-1);  //前一句是真跳转到and的后一句
//            fillBack(nextlist,table.size()+1);//+1就是隔一句的意思
//            addItem("j",0,0,0);
//            falselist.add(table.size()-1);
//            advance();
//            boolSenb(truelist,falselist);
//        }
//    }
//    private void boolSenb(List<Integer> truelist,List<Integer> falselist) throws SemanticException{//布尔表达式的子项
//        if(pair.getFirst() == 8){//NOT
//            advance();
//            if(pair.getFirst() == 18){// (
//                advance();
//                boolSen(falselist,truelist);
//            }
//            if(pair.getFirst() == 19)// )
//                advance();
//        }
//        else{
//            int address1 = computeSenE();
//            String op = "j"+ pair.getValue();
//            advance();
//            int address2 = computeSenE();
//            addItem(op,address1,address2,0);
//        }
//    }
//
//
//    private void whileSen() throws SemanticException{
//        List<Integer> truelist = new ArrayList<Integer>();
//        List<Integer> falselist = new ArrayList<Integer>();
//        advance();
//        int head = table.size();	//记录while的开始位置
//        boolSen(truelist,falselist);
//        fillBack(truelist,table.size());  //回填条件为真的跳转
//        advance();
//        sen();
//        addItem("j",0,0,head);	//跳回while的开头
//        fillBack(falselist,table.size());
//    }
//
//
//    private void fillBack(List<Integer> list, int lab){
//        for(int i = list.size()-1 ; i>=0 ;i--){
//            Item item = table.get(list.get(i));
//            item.setAddr3(lab);
//            table.set(list.get(i), item);
//            list.remove(i);
//        }
//
//    }
//
//    //处理
//    public void process() throws SemanticException{
//        BufferedReader reader =null;
//        try {
//            reader = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
//            analyser = new CIFFAAnalysis(reader);
//
//            advance();  //程序一开始的Program
//            advance();  //程序名
//            advance();  //分号
//            advance();  //取得程序代码的第一个有用元组
//
//            while(pair.getFirst()!=21)
//                sen();
//        } catch (IOException e) {
//            System.out.println(e);
//        }finally{
//            try {
//                reader.close();
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }
//
//    }
//
//
//}
